THE SOURCERER - RSDOS VERSION INTRODUCTION: Computerware is making a large investment in the software future of the Color Computer. We are working on software products at both the assembly and BASIC Language level, as well as both serious and entertainment oriented. To achieve this goal, we need your support... One of the problems that developers of software have is that it takes a lot of initial time and money to 'create' the product before any revenue from its sale is generated. All too often when it is finished, customers who are not familiar with the development cycle for software products, see a cassette or disk and a manual and perceive that that is what the product cost. NOT TRUE !! To be able to recover the development costs on inexpensive software, the manufacturer has to be able to sell a large number of copies. This is where you, the customer, can help by not giving away (or accepting from others) copyrighted software - actually any software product that is being offered for sale. We have a lot of customers who tell us that they actively support us because they want our support in the years to come. When you think about that fact it makes sense. If we can't make enough sales because people are stealing copies of our products we will not continue to put our efforts into developing those products. So the bottom line is simply this: respect the copyright of software and do your part by not giving away or accepting copies of software that is offered for sale. Thank you, Computerware LICENSE: Computerware, Sourcerer, in all machine readable formats, and the written documentation accompanying them are copyrighted. The purchase of Computerware Sourcerer conveys to the purchaser a license to use Computerware Sourcerer for his/her own use, and not for sale or free distribution to others. No other license, expressed or implied is granted. WARRANTY INFORMATION: The license to use Computerware Sourcerer is sold AS IS without warranty. This warranty is in lieu of all other warranties expressed or implied. Computerware does not warrant the suitability of Sourcerer for any particular user application and will not be responsible for damages incidental to its use in a user system. If this product should fail to load during the first 90 days of use, simply return the ORIGINAL cassette or disk along with a copy of the receipt for a free replacement. Please try the back side of your cassette before returning it. If this program fails to load after the 90 day warranty, just send your ORIGINAL cassette or disk along with $5.00 for cassette versions or $8.00 for disk versions to Computerware and we will repair or replace it at our option. OVERVIEW The Sourcerer is probably the most powerful disassembler/source generator available for the TRS-80 Color Computer. It is written in position independent code and is just over 6.5K bytes long. All that is required is 16K of memory and standard BASIC. (32K of memory may be required to disassemble larger programs and is required to run the COMPARE program.) Output to a printer, disk and cassette as well as the screen is supported. There are a number of different modes available to make the resulting source code as meaningful as possible. WHAT YOU GET If you purchased the Sourcerer on cassette, you will find the file SORCERER on side 1 and a BASIC program called the Sourcerer's Apprentice (filename APRENTIS) on side 2. The Apprentice allows cassette users to find start, end, and transfer addresses of cassette files. If you purchased the Sourcerer on disk, you will find the files SORCERER/BIN, APRENTIS/BAS,FIND/BIN, and COMPARE/BIN. The first two are the same as supplied on cassette. The FIND program does the same thing as the Apprentice, but works only for disk files and is written in machine language. The COMPARE program does a file to memory, byte by byte compare. You can use this to make sure that your reassembled code is the same as the code you originally disassembled. Instructions fo the Apprentice, FIND, and COMPARE can be found in Appendix A. GETTING STARTED Before you start, you should load the program you intend to disassemble into memory. The Sourcerer coexists in memory with the program it is disassembling. To load the Sourcerer from cassette, put the tape in the player and press the PLAY button. Type CLOADM and press the ENTER key. To load from disk, put the diskette in drive 0 and type LOADM"SORCERER and press the ENTER key. Once the program has loaded, type EXEC to start it up. NOTE: The Sourcerer normally loads from $1000 to $2A88. If this conflicts with the code you will be disassembling, you should load the program with on offset. For example, LOADM"SORCERER",&H5000 will load the program into memory starting at $6000. (This assumes that you have 32K of memory.) If you don't know the start and end addresses of the object program, use the included 'FIND' or 'APRENTIS'. (See Appendix A) Once the program has started, you will see on the screen: THE SOURCERER v.r BY F. DELARGY (C) 1983 COMPUTERWARE [S]CREEN [P]RINTER [Q]UIT [T]APE [D]ISK The v.r is the version and the release number. The present number is 2.0 but this may change as additional features are added. At this point, you should select the device you want the output to go to. You may also select Q to Quit. If you selected the screen for output, you should skip to the next section titled Modes of Execution. Note that the output will be sent to the screen at the same time as it is being sent to any other device. If you select Tape, Disk or the Printer, you will be asked for the filename to use for the resulting file. This name will appear at the top of the listing. The filename you enter should be eight (8) or less characters long. Do NOT enter an extension for disk files, it will automatically be set to the .SRC. If you requested output to a disk or cassette file, you will next be asked if you want the file to be written in EDTASM+ format. If you are not making a Symbolic disassembly, you should answer no. Due to limitations in the EDTASM+ file format which are not in other assemblers (like our Macro Assembler), you will need to use this option if you intend to re-assemble the file with EDTASM+. A positive response will cause the resulting file to have no NAM statement, single FCB's and FDB's, and TAB characters instead of spaces. (See Appendix B). After you enter the filename, you will be asked if you want line numbers included in the file. Some assemblers require line numbers, others don't. Check your particular assembler manual to see if you need them. Computerware's Macro assembler does not need line numbers and in fact will not work if there are line numbers in the source file. MODES OF EXECUTION There are three modes of execution in the Sourcerer. Each is designed to help you get a more understandable (and assemblable) source code. Each of these modes is discussed below. ZAP MODE: Most machine language programs have ASCII strings and address or data tables interspersed throughout the program. Identification of these areas will be the most difficult part of disassembling most programs. Sometimes it will be easy to find these areas as they may be placed at the end of the program (like he Sourcerer and Find) but other times it will take a fair amount of analysis to find them. The Zap mode is used to help find areas of the program which are not valid 6809 code. Within the Zap mode, there are two sub-modes - Numeric and Alphanumeric. Alpha mode will display an ASCII dump of the range of memory specified. This is useful for finding strings. The Numeric mode displays a hex dump of the range of memory specified. A numeric Zap sent to the printer will also have the ASCII representation displayed. This is probably the best way to use the Zap mode. This will help you find specific addresses for the start and end of tables. Examples of each of these modes can be found in Appendix C. As soon as you enter the ending address, you will be asked to make sure the output device is ready. When it is, press any key and the listing will start. You can press the BREAK key at any time during the listing to stop it. LONG MODE: The long disassembly mode can be used as a method of documentation or as an interactive analysis or debugging tool. It produces an assembly listing that uses absolute addresses as opposed to symbols and labels. Each output line consists of the following fields. LINE NUMBER ADDRESS MACHINE CODE MNEMONIC DATA (optional) For Example: 0044 0F78 BDCF38 JSR $CF38 Any areas of memory that cannot be disassembled will be printed with an FCB of the byte in question and a comment line of * ERROR *. These are the areas that should be investigated further with the Zap mode. This output was designed to look like a assembly listing. Since the machine code is included in the listing, you cannot reassemble a long disassembly. (See Symbolic Mode below.) After selecting the Long mode of disassembly, you will be asked for the starting and ending addresses to work on. Remember, the program you want to work on MUST be in memory before you start. If you have already found some areas of memory that are tables (FCC's, FCB's, or FDB's), you can define them now. If you don't have any tables, answer the TABLES? prompt with a N and go on to the next section. If you do have tables to define, the first thing you will be asked is if you want single FCB's. Some assemblers can only handle one FCB per line of code. Others, like our Macro Assembler, can have more than one per line. Check your specific assembler manual to find out for sure. Next you will enter the start and end of each table you found. You also get to tell the Sourcerer if the table is to be made up of FCC's, FCB's, or FDB's. After you enter the information for the last table, enter the start address for the next table as FFFF. The maximum number of tables is 32. After you enter the 32nd table, the program will automatically move on. If you have previously defined some tables, you are given the option of re-using them. You can either use the tables as they are or make changes and additions to the table list. If you ask to make changes, you will see up to three screens of 12 previously defined tables (8 on the last screen for a total of 32). You now have the option of (A)dding new tables, (D)eleting old tables, temporarily going to the (Z)ap mode to find more tables, or (C)ontinuing with the disassembly. If you need to change a table, first Delete it and then re-enter it correctly. The Long disassembly is a one-pass process. As soon as you finish entering the table information, you will be asked to make sure that the output device is ready. Press any key and the listing will start. SYMBOLIC MODE: The Symbolic mode is the most powerful available. With a symbolic disassembly to tape or disk, you can read the resulting source file with an assembler and immediately assemble the code with or without any modifications you wish to make. You can, for example, disassemble your favorite game and change the scoring rules, number of players, or any other feature you want and then reassemble your own custom version of Space Bleepers. The Symbolic mode is a two pass process. During the first pass, the Sourcerer finds all the extended addresses and assigns symbols to them. Any extended addresses which are not within the range of the code being disassembled are put in as EQUate lines at the top of the listing. Labels and symbols are made up of the letters R, X, B, C, U, or H and the actual address in hex. The letters stand for(R)AM, e(X)tended BASIC ROM, standard (B)ASIC ROM, (C)artridge area, (U)ndefined memory, and (H)ardware addresses respectively. This will make it easy for you to use an editor and change any familiar addresses to the more common name. For example, the label BA002 can be changed to CHROUT. (The character output vector). Most editors will allow you to change all occurrences of the label with only one change command. You can also add comments while using the editor. Upon selecting the Symbolic mode, you will be asked if you want all the labels. If you respond (N)o, the Sourcerer will produce labels for program counter relative instructions only. These include Load Effective Address (LEAX, LEAY, etc.) and Branch or Jump to Subroutine (JSR, BSR). This should suffice for most programs. Next, you will be asked to enter the size of the label buffer. A $0600 byte buffer is usually enough for an 8K program such as the BASIC ROM. Most programs will require less than this. The Sourcerer will display the last memory location to be used for the label buffer on the screen. If this number falls outside your available memory or overlaps the program you are disassembling, you should start over and use a smaller buffer. Pass one of the Symbolic Mode just assigns symbols to appropriate addresses. You must enter the starting and ending addresses for pass one to work on. If you have tables to define, you will be allowed to enter them at this pointÑ (See above for details). CONTROL FUNCTIONS During a listing to the screen, there are a number of keys that the Sourcerer listens to. These are: KEY FUNCTION --- -------- BREAK 1 - Change from listing mode to paging mode. 2 - Stops the Disassembly and returns to Menu. NOTE: Pressing the BREAK key will stop the disassembly to any device. S 1 - While the Symbolic mode, Skips EQUates 2 - During listing, toggles list speed (fast/slow). H Halts output until another key is pressed. J Jump to a new address. Continue disassembly from there. B Go back to where you were before the last jump. L Change from paging to Listing mode. C Continue from paging to Listing mode. R Quit. Return to menu. APPENDIX A The Additional Utility Programs As mentioned before, there are some utility programs included with the Sourcerer which will make your source generating a lot easier. Below, you will find instructions for using these programs. The Sourcerer's Apprentice This program is located on the back of the cassette. It is written in BASIC and should therefore be loaded with CLOAD from tape of LOAD"APRENTIS from disk. Once the program is loaded, type RUN to start it up. You will first be asked if you are working from Tape or Disk. Press 'T' or 'D'. If you selected tape, you will be told to get the tape ready and press ENTER. Make sure the tape is positioned just before the file you are interested in and the PLAY button is pressed before pressing ENTER. The start, end, and transfer addresses of the next file on the tape will be displayed on the screen. If you selected disk, you will be asked for the filename and the extension. Again, the start, end and transfer addresses will be displayed on the screen. FIND (Disk version only) FIND is similar to the Apprentice. To run FIND, simply type LOADM"FIND and press ENTER. The program will EXECute automatically after loading. Now just enter the filename of the disk file you are interested in. You are given the option at this point to direct the output to the printer. Any character other than 'Y' will cause the output to go to the screen. In a few moments, the start, end and transfer addresses will be displayed. To exit FIND, just press ENTER when it asks for a filename. FIND loads from $0F00 through $1202. COMPARE (Disk version only) COMPARE is used to find any differences between two binary files. To use COMPARE, you should first load one of the files into memory. Then type LOADM"COMPARE. The program will automatically EXECute. At the MATCH: prompt, enter the filename of the other file (the one you DIDN'T load into memory). COMPARE will then give you the option of having the output sent to the printer. Finally, COMPARE will produce a table showing the addresses where it found differences between the file and memory. COMPARE loads from $7B00 through $7DC4. APPENDIX B Modifying the Sourcerer There are a few areas of the Sourcerer which can be modified by the user to reflect his own system. It is recommended that you make the changes desired and save the new version onto a new disk, NOT your original master disk. If your printer requires line feeds after each carriage return, just POKE &H1002,1 and they will be added by the program. If this location contains a 0, no line feeds are sent. The program defaults to no line feeds (this is standard for most printers). If you are using an alternate screen display (like a terminal or our 64K Screen Expander), you can tell the Sourcerer to use the extra lines on the screen. Just POKE &H1005,n where the n is equal to the number of lines you are capable of displaying minus 1. This is set to 14 as the program is supplied. For the Screen Expander, you should poke this locations with a 23. If you are only using Radio Shack's EDTASM+ assembler, you will want to POKE &H1003,1. After this change, the Sourcerer will always write EDTASM+ compatible files to the disk. If you will never use the EDTASM+ format, you will want to POKE &H1003,255. With this change, the Sourcerer will always write standard files to the disk. If you are using boÑ!formats, leave this byte a 0 and you will be prompted each time you write a disk file. APPENDIX C A Sample Session with the Sourcerer Disassembling FIND.BIN On the following pages, you will find instructions and sample listings for disassembling the FIND.BIN file supplied on the disk. The first page is a numeric ZAP which makes it easy to see that there are tables from 116B to 1177 (FCB's) and from 1178 to 1202 (FCC's). With these tables entered, the resulting long and symbolic disassemblies are shown on the next four pages. PROGRAM:FIND.BIN PAGE No. 01 THE SOURCERER 0F00 32 62 B6 C0 03 81 08 27 05 8E C6 B7 20 03 8E C6 0F10 E4 BF 01 83 4F BD A9 10 8E 11 89 BD 11 48 8E 11 0F20 99 7F 11 6D BD 11 48 8E 00 00 9F 68 BD A3 90 BD 0F30 10 BE 7D 11 6B 10 27 01 44 8E 11 78 BD 11 48 7F The ASCII 0F40 11 6C BD A1 B1 BD A2 82 81 59 26 05 86 FE B7 11 represen- 0F50 6C 86 0D BD A2 82 B6 C0 03 81 08 27 05 BD C6 5F tation 0F60 20 03 BD C6 8C 7D 09 73 26 05 86 01 7E 10 81 B6 in this 0F70 C0 03 81 08 27 05 BD C9 59 20 03 BD CA 07 FC 09 column 0F80 57 83 02 00 27 08 BD A4 2D 86 02 7E 10 81 B6 C0 has been 0F90 03 81 08 27 21 BD CC E2 34 02 BD CF 37 1F 02 10 deleted 0FA0 BF 11 72 BD CF 37 FD 11 6E 1F 01 BF 11 70 A6 E0 due to 0FB0 10 26 00 94 20 1D BD CD BC 34 02 BD D0 13 1F 02 lack of 0FC0 10 BF 11 72 BD D0 13 FD 11 6E 1F 01 BF 11 70 A6 space. 0FD0 E0 26 75 7D 11 6D 27 05 BC 11 76 27 35 96 6F B7 -dem- 0FE0 11 6B B6 11 6C 97 6F 7D 11 6D 27 0B BE 11 76 30 0FF0 1F BF 11 74 BD 10 AC 8E 11 A3 BD 11 48 8E 11 70 1000 BD 11 52 B6 11 6B 97 6F BD A1 C1 27 05 BD A1 C1 1010 27 FB BD 10 9C BE 11 74 30 01 BF 11 76 C6 01 F7 1020 11 6D 10 BE 11 72 B6 C0 03 81 08 27 0A BD C5 97 1030 D6 70 27 0D 7E C3 34 BD C5 C4 D6 70 27 03 7E C3 1040 52 31 3F 26 E1 7E 0F 8E BD A4 2D B6 11 6C 97 6F 1050 BE 11 76 30 1F BF 11 74 BD 10 AC 8E 11 B0 BD 11 1060 48 8E 11 6E BD 11 52 7D 11 6C 27 08 8E 11 A1 BD 1080 11 48 0F 6F 8E 11 A1 BD 11 48 7E 0F 1E 9E 72 6E 1080 84 81 01 26 09 8E 11 BF BD 11 48 7E 0F 1E 81 F2 1090 26 05 8E 11 D9 20 F1 8E 11 F1 20 EC FC 11 70 F3 10A0 11 72 83 00 01 FD 11 74 39 BD 10 9C 8E 11 A9 BD 10B0 11 48 8E 11 74 BD 11 52 86 0D BD A2 82 39 7F 11 10C0 6B 8E 02 DD A6 80 81 00 27 0A 8C 03 1E 27 05 7C 10D0 11 6B 20 F0 B6 09 5A 97 EB BF 11 76 BD 11 38 8E 10E0 09 4C CC 20 08 A7 80 5A 26 FB BD 11 38 F6 11 6B 10F0 C1 02 25 37 8E 02 DD A6 01 81 3A 26 0C A6 84 84 1100 03 97 EB 30 02 C6 02 20 01 5F CE 09 4C A6 80 27 1110 1A 5C 81 2E 26 05 CE 09 54 20 F2 81 2F 27 F7 81 1120 3A 27 09 A7 C0 11 83 09 56 23 E2 39 F1 11 6B 24 1130 FA A6 84 84 03 97 EB 39 8E 09 54 86 42 A7 84 86 1140 49 A7 01 86 4E A7 02 39 A6 80 27 05 BD A2 82 20 1150 F7 39 8D 02 30 01 A6 84 44 44 44 44 8D 02 A6 84 1160 84 0F 8B 90 19 89 40 19 7E A2 82 00 00 00 00 00 1170 00 00 00 00 00 00 02 DE 50 52 49 4E 54 45 52 20 1180 3F 20 28 59 2F 4E 29 20 00 46 49 4E 44 20 20 20 1190 56 45 52 20 35 2E 30 0D 00 46 49 4E 44 20 3A 20 11A0 00 0D 00 46 52 4F 4D 20 00 20 54 48 52 55 20 00 11B0 54 52 41 4E 53 46 45 52 20 41 44 44 52 20 00 0D 11C0 43 41 4E 4E 4F 54 20 46 59 4E 44 20 54 48 45 20 11D0 46 49 4C 45 20 21 22 0D 00 0D 46 49 4C 45 20 49 11E0 53 20 4E 4F 54 20 42 49 4E 41 52 59 20 21 22 0D 11F0 00 0D 53 59 53 54 45 4D 20 45 52 52 4F 52 20 21 1200 22 0D 00 PROGRAM:FIND.BIN PAGE No. 01 THE SOURCERER 0F00 3262 LEAS $02,S 0F02 B6C003 LDA $C003 0F05 8108 CMPA #$08 0F07 2705 BEQ $0F0E 0F09 8EC6B7 LDX #$C6B7 0F0C 2003 BRA $0F11 0F0E 8EC6E4 LDX #$C6E4 0F11 BF0183 STX $0183 0F14 4F CLRA 0F15 BDA910 JSR $A910 0F18 8E1189 LDX #$1189 - First page of the long 0F1B BD1148 JSR $1148 mode disassembly. Not 0F1E 8E1199 LDX #$1199 very descriptive. 0F21 7F116D CLR $116D 0F24 BD1148 JSR $1148 0F27 8E0000 LDX #$0000 0F2A 9F68 STX $68 0F2C BDA390 JSR $A390 0F2F BD10BE JSR $10BE 0F32 7D116B TST $116B 0F35 10270144 LBEQ $107D 0F39 8E1178 LDX #$1178 0F3C BD1148 JSR $1148 0F3F 7F116C CLR $116C 0F42 BDA1B1 JSR $A1B1 0F45 BDA282 JSR $A282 0F48 8159 CMPA #$59 0F4A 2605 BNE $0F51 0F4C 86FE LDA #$FE 0F4E B7116C STA $116C 0F51 860D LDA #$0D 0F53 BDA282 JSR $A282 0F56 B6C003 LDA $C003 0F59 8108 CMPA #$08 0F5B 2705 BEQ $0F62 0F5D BDC65F JSR $C65F 0F60 2003 BRA $0F65 0F62 BDC68C JSR $C68C 0F65 7D0973 TST $0973 0F68 2605 BNE $0F6F 0F6A 8601 LDA #$01 0F6C 7E1081 JMP $1081 0F6F B6C003 LDA $C003 0F72 8108 CMPA #$08 0F74 2705 BEQ $0F7B 0F76 BDC959 JSR $C959 0F79 2003 BRA $0F7E 0F7B BDCA08 JSR $CA07 0F7E BC0957 LDD $0957 0F81 830200 SUBD #$0200 0F84 2708 BEQ $0F8E 0F86 BDA42D JSR $A42D 0F89 8602 LDA #$02 0F8B 7E1081 JMP $1081 0F8E 86C003 LDA $C003 0F91 8108 CMPA #$08 0F93 2721 BEQ $0FB6 0F95 BDCCE2 JSR $CCE2 0F98 3402 PSHS A 0F9A BDCF37 JSR $CF37 0F9D 1F02 TFR D,Y . . . 115B 44 LSRA 115C 8D02 BSR $1160 115E A684 LDA ,X 1160 840F ANDA #$0F 1162 8B90 ADDA #$90 1164 19 DAA 1165 8940 ADCA #$40 1167 19 DAA 1168 7EA282 JMP $A282 116B FCB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$02,$DE 1178 FCC /PRINTER ? (Y/ FCC '/' 1185 FCC /N) / FCB $00 1189 FCC /FIND VER 5.0/ - Last page of the long FDB $0D,$00 mode disassembly. 1199 FCC /FIND : / Notice the FCB and FCB $00,$0D,$00 FCC tables. 11A3 FCC /FROM / FCB $00 11A9 FCC / THRU / FCB $00 11B0 FCC /TRANSFER ADDR / FCB $00,$0D 11C0 FCC /CANNOT FIND THE FILE !"/ FCB $0D,$00,$0D 11DA FCC /FILE IS NOT BINARY !"/ FCB $0D,$00,$0D 11F2 FCC /SYSTEM ERROR !"/ FCB $0D,$00 PROGRAM:FIND.BIN PAGE No. 01 THE SOURCERER NAM FIND.BIN BA1B1 EQU $A1B1 BA1C1 EQU $A1C1 BA282 EQU $A282 BA390 EQU $A390 BA42D EQU $A42D BA910 EQU $A910 CC334 EQU $C334 CC352 EQU $C352 CC597 EQU $C597 - First page of the CC5C4 EQU $C5C4 symbolic disassembly. CC65F EQU $C65F Notice NAM, EQU and CC68C EQU $C68C ORG statements. CC959 EQU $C959 Also notice the use CCA07 EQU $CA07 of labels. CCCE2 EQU $CCE2 CCDBC EQU $CDBC CCF37 EQU $CF37 CD013 EQU $D013 ORG $0F00 0F00 3262 R0F00 LEAS $02,S 0F02 B6C003 LDA $C003 0F05 8108 CMPA #$08 0F07 2705 BEQ R0FDE 0F09 8EC6B7 LDX #$C6B7 0F0C 2003 BRA R0F11 0F0E 8EC6E4 R0F0E LDX #$C6E4 0F11 BF0183 R0F11 STX $0183 0F14 4F CLRA 0F15 BDA910 JSR BA910 0F18 8E1189 LDX #$1189 0F1B BD1148 JSR R1148 0F1E 8E1199 R0F1E LDX #$1199 0F21 7F116D CLR $116D 0F24 BD1148 JSR R1148 0F27 8E0000 LDX #$0000 0F2A 9F68 STX $68 0F2C BDA390 JSR BA390 0F2F BD10BE JSR R10BE 0F32 7D116B TST $1168 0F35 10270144 LBEQ R107D 0F39 8E1178 LDX #$1178 0F3C BD1148 JSR R1148 0F3F 7F116C CLR $116C 0F42 BDA1B1 JSR BA1B1 0F45 BDA282 JSR BA282 0F48 8159 CMPA #$59 0F4A 2605 BNE R0F51 0F4C 86FE LDA #$FE 0F4E B7116C STA $116C 0F51 860D R0F51 LDA #$0D 0F53 BDA282 JSR BA282 0F56 B6C003 LDA $C003 0F59 8108 CMPA #$08 0F5B 2705 BEQ R0F62 0F5D BDC65F JSR CC65F . . . 1125 11830956 CMPU #$0956 1129 23E2 BLS R110D 112B 39 R112B RTS 112C F1116B R112C CMPB $1168 112F 24FA BHS R112B 1131 A684 LDA ,X 1133 8403 ANDA #$03 1135 97EB STA $EB 1137 39 RTS 1138 8E0954 R1138 LDX #$0954 113B 8642 LDA #$42 113D A784 STA ,X 113F 8649 LDA #$49 1141 A701 STA $01,X 1143 864E LDA #$4E - Last page of the 1145 A702 STA $02,X symbolic disassembly. 1147 39 RTS This file could be 1148 A680 R1148 LDA ,X+ assembled to produce 114A 27Ñ! BEQ R1151 a duplicate of the 114C BDA282 JSR BA282 FIND program 114F 20F7 BRA R1148 1151 39 R1151 RTS 1152 8D02 R1152 BSR R1156 1154 3001 LEAX $01,X 1156 A684 R1156 LDA ,X 1158 44 LSRA 1159 44 LSRA 115A 44 LSRA 115B 44 LSRA 115C 8D02 BSR R1160 115E A684 LDA ,X 1160 840F R1160 ANDA #$0F 1162 8B90 ADDA #$90 1164 19 DAA 1165 8940 ADCA #$40 1167 19 DAA 1168 7EA282 JMP BA282 T116B FCB $00,$00,$00,$00,$00,$0,,$00,$00,$00,$02 FCB $DE T1178 FCC /PRINTER ? (Y/ FCC '/' FCC /N) / FCB $00 FCC /FIND VER 5.0/ FCB $0D,$00 FCC /FIND : / FCB $00,$0D,$00 FCC /FROM / FCB $00 FCC / THRU / FCB $00 FCC /TRANSFER ADDR / FCB $00,$0D FCC /CANNOT FIND THE FILE !"/ FCB $0D,$00,$0D FCC /FILE IS NOT BINARY !"/ FCB $0D,$00,$0D FCC /SYSTEM ERROR !"/ FCB $0D,$00 END R0F00 B>^S